#ifndef DMSTRUCT_H
#define DMSTRUCT_H

#include <variant>

#include "dmdef.h"
#include "dmenum.h"

/*! 均衡器参数 */
typedef struct EQArgument
{
    uint16_t freq = EQ_FREQUENCY_MIN;       // 频率
    EQType type = EQType::PEQ;              // 滤波器类型
    uint16_t bw = EQ_BW_DEFAULT;            // 带宽
    double gain = EQ_GAIN_DEFAULT;          // 增益
}EQ;

/*! 高低通 */
typedef struct HpfOrLpf
{
    XoverType type;                         // 高通/低通
    uint16_t freq;                          // 频率
    PfType ftype;                           // 滤波器类型
    Slope slope;                            // 斜率
}Xover;

struct NoiseGate
{
    int threshold = NOISE_GATE_THRESHOLD_DEFAULT;   // 启动阀值
};

/*! 限制器 */
struct Limiter
{
    double threshold = DYNAMIC_X_THRESHOLD_DEFAULT; // 启动阀值
    uint16_t attack = DYNAMIC_X_ATTACK_DEFAULT;          // 启动时间
    uint16_t decay = DYNAMIC_X_DECAY_DEFAULT;          // 释放时间
};

/*! 压缩器 */
struct Compressor
{
    double threshold = DYNAMIC_X_THRESHOLD_DEFAULT; // 启动阀值
    uint16_t attack = DYNAMIC_X_ATTACK_DEFAULT;          // 启动时间
    uint16_t decay = DYNAMIC_X_DECAY_DEFAULT;          // 释放时间
    uint8_t ratio = DYNAMIC_X_RATIO_DEFAULT;            // 压缩比例
};

using DMVariant = std::variant<EQ, Xover>;
using DXVariant = std::variant<NoiseGate, Limiter, Compressor>;

template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;


#endif // DMSTRUCT_H
